linux 终端崩溃排查
·
Table of Contents
现象
第一次发生崩溃是在使用Ctrl+R 进行历史命令搜索时发生,
按下Ctrl+R
后, 1秒内终端就直接退出了
排查过程
重置终端
# 重置gnome-terminal配置
dconf reset -f /org/gnome/terminal/
# 或完全删除配置
rm -rf ~/.config/gnome-terminal/
检查日志
journalctl -xe | grep -i terminal
dmesg | grep -i error
尝试其他终端
- 首次使用tilix时,发现正常了
- 但是这只是表象 ORZ
- 用了一天之后,又发生了同样的异常
apt install tilix
tilix
怀疑fzf
首先 Ctrl + R 绑定的程序是fzf
bindkey | grep -Ei '\^r'
- 直接运行fzf发现就会发生崩溃
为什么新安装的终端不会崩溃呢?
- 使用strace发现fzf发生了141退出吗,
- 搜索后发现是sigpipe导致的:
sig = errno - 128 = 141 - 128 = 13
- 即退出码141对应信号13(SIGPIPE)
strace -f -o fzf.log fzf
strace -f -e trace=pipe,write,socket -o debug.log fzf
- 怀疑是结果过大导致的
- 最后缩小范围,发现候选行数超过一定行数fzf就会报错
- 但是这个值会发生变化
yes | head -n 46149 | fzf
seq 50000 | fzf
换终端模拟器
- apt install kitty
- apt install alacritty
- apt install tilix #(也基于 VTE,但版本有时会稍微稳定些)
- 用 tmux 作为缓冲
seq 1000000 | fzf
我切换了kitty终端,发现是正常的, 怀疑的确是VTE的bug导致的
为什么 kitty / alacritty 正常?
终端 | 渲染引擎 | 特点 |
---|---|---|
kitty | 自研 GPU 加速 | 高性能,专为大输出优化 |
alacritty | GPU 加速(OpenGL) | 极致性能,Rust 编写 |
gnome-terminal / tilix | VTE(CPU 渲染) | 功能完整但性能较弱 |
👉 kitty 和 alacritty 使用现代渲染架构,能更高效处理 fzf 的快速滚动和高密度输出。
解决方案
续使用 kitty 或 alacritty(推荐)
这是最稳定、长期有效的方案:
# 安装 kitty
sudo apt install kitty
# 或安装 alacritty
sudo apt install alacritty
💡 推荐 kitty:功能丰富、文档完善、对 fzf/tmux 支持极佳。
升级 VTE 到 0.76+(风险较高)
Ubuntu 24.04 默认未提供新版 VTE,但您可以:
- 从 Debian 测试源或第三方 PPA 安装
# 添加提供新版 VTE 的 PPA(需谨慎)
# 例如:https://launchpad.net/~gnome-team/+archive/ubuntu/gnome3
sudo add-apt-repository ppa:gnome-team/gnome3
sudo apt update
sudo apt install libvte-2.91-dev libvte-2.91-0
什么是 VTE?
VTE 是 GNOME Terminal、Tilix、MATE Terminal 等使用的底层终端控件库(libvte) Ubuntu 24.04 默认带的是 VTE 0.74.x,这个版本在 Gitlab issue 里已经有 “ncurses 程序在大数据输入下崩溃” 的 bug 报告,可以试试更新到 0.76+ 或从源码编译新版本。 该版本在处理高吞吐量、快速连续的 ANSI/VT100 控制序列输出时,存在缓冲区管理缺陷